if (gi->glyph != PANGO_GLYPH_EMPTY)
{
- double cx = (double)(x_position + gi->geometry.x_offset) / PANGO_SCALE;
- double cy = (double)(gi->geometry.y_offset) / PANGO_SCALE;
+ double cx = (x_position + gi->geometry.x_offset) / PANGO_SCALE;
+ double cy = gi->geometry.y_offset / PANGO_SCALE;
GskVulkanColorTextInstance *instance = &instances[count];
GskVulkanCachedGlyph *glyph;
- glyph = gsk_vulkan_renderer_get_cached_glyph (renderer, font, gi->glyph, scale);
+ glyph = gsk_vulkan_renderer_get_cached_glyph (renderer,
+ font,
+ gi->glyph,
+ x_position + gi->geometry.x_offset,
+ gi->geometry.y_offset,
+ scale);
instance->tex_rect[0] = glyph->tx;
instance->tex_rect[1] = glyph->ty;
typedef struct {
PangoFont *font;
PangoGlyph glyph;
+ guint xshift;
+ guint yshift;
guint scale; /* times 1024 */
} GlyphCacheKey;
return key1->font == key2->font &&
key1->glyph == key2->glyph &&
+ key1->xshift == key2->xshift &&
+ key1->yshift == key2->yshift &&
key1->scale == key2->scale;
}
{
const GlyphCacheKey *key = v;
- return GPOINTER_TO_UINT (key->font) ^ key->glyph ^ key->scale;
+ return GPOINTER_TO_UINT (key->font) ^ key->glyph ^ (key->xshift << 24) ^ (key->yshift << 26) ^ key->scale;
}
static void
gi.glyph = key->glyph;
gi.geometry.width = value->draw_width * 1024;
if (key->glyph & PANGO_GLYPH_UNKNOWN_FLAG)
- gi.geometry.x_offset = 0;
+ gi.geometry.x_offset = key->xshift * 256;
else
- gi.geometry.x_offset = - value->draw_x * 1024;
- gi.geometry.y_offset = - value->draw_y * 1024;
+ gi.geometry.x_offset = key->xshift * 256 - value->draw_x * 1024;
+ gi.geometry.y_offset = key->yshift * 256 - value->draw_y * 1024;
glyphs.num_glyphs = 1;
glyphs.glyphs = &gi;
return cache;
}
+#define PHASE(x) ((x % PANGO_SCALE) * 4 / PANGO_SCALE)
+
GskVulkanCachedGlyph *
gsk_vulkan_glyph_cache_lookup (GskVulkanGlyphCache *cache,
gboolean create,
PangoFont *font,
PangoGlyph glyph,
+ int x,
+ int y,
float scale)
{
GlyphCacheKey lookup_key;
GskVulkanCachedGlyph *value;
+ guint xshift;
+ guint yshift;
+
+ xshift = PHASE (x);
+ yshift = PHASE (y);
lookup_key.font = font;
lookup_key.glyph = glyph;
+ lookup_key.xshift = xshift;
+ lookup_key.yshift = yshift;
lookup_key.scale = (guint)(scale * 1024);
value = g_hash_table_lookup (cache->hash_table, &lookup_key);
key->font = g_object_ref (font);
key->glyph = glyph;
+ key->xshift = xshift;
+ key->yshift = yshift;
key->scale = (guint)(scale * 1024);
if (ink_rect.width > 0 && ink_rect.height > 0)
gboolean create,
PangoFont *font,
PangoGlyph glyph,
+ int x,
+ int y,
+
float scale);
void gsk_vulkan_glyph_cache_begin_frame (GskVulkanGlyphCache *cache);
return image;
}
-guint
-gsk_vulkan_renderer_cache_glyph (GskVulkanRenderer *self,
- PangoFont *font,
- PangoGlyph glyph,
- float scale)
-{
- return gsk_vulkan_glyph_cache_lookup (self->glyph_cache, TRUE, font, glyph, scale)->texture_index;
-}
-
GskVulkanImage *
gsk_vulkan_renderer_ref_glyph_image (GskVulkanRenderer *self,
GskVulkanUploader *uploader,
return g_object_ref (gsk_vulkan_glyph_cache_get_glyph_image (self->glyph_cache, uploader, index));
}
+guint
+gsk_vulkan_renderer_cache_glyph (GskVulkanRenderer *self,
+ PangoFont *font,
+ PangoGlyph glyph,
+ int x,
+ int y,
+ float scale)
+{
+ return gsk_vulkan_glyph_cache_lookup (self->glyph_cache, TRUE, font, glyph, x, y, scale)->texture_index;
+}
+
GskVulkanCachedGlyph *
gsk_vulkan_renderer_get_cached_glyph (GskVulkanRenderer *self,
PangoFont *font,
PangoGlyph glyph,
+ int x,
+ int y,
float scale)
{
- return gsk_vulkan_glyph_cache_lookup (self->glyph_cache, FALSE, font, glyph, scale);
+ return gsk_vulkan_glyph_cache_lookup (self->glyph_cache, FALSE, font, glyph, x, y, scale);
}
/**
guint gsk_vulkan_renderer_cache_glyph (GskVulkanRenderer *renderer,
PangoFont *font,
PangoGlyph glyph,
+ int x,
+ int y,
float scale);
GskVulkanImage * gsk_vulkan_renderer_ref_glyph_image (GskVulkanRenderer *self,
GskVulkanCachedGlyph * gsk_vulkan_renderer_get_cached_glyph (GskVulkanRenderer *self,
PangoFont *font,
PangoGlyph glyph,
+ int x,
+ int y,
float scale);
int i;
guint count;
guint texture_index;
+ gint x_position;
GskVulkanRenderer *renderer = GSK_VULKAN_RENDERER (gsk_vulkan_render_get_renderer (render));
if (font_has_color_glyphs (font))
op.text.texture_index = G_MAXUINT;
op.text.scale = self->scale_factor;
+ x_position = 0;
for (i = 0, count = 0; i < num_glyphs; i++)
{
const PangoGlyphInfo *gi = &glyphs[i];
- texture_index = gsk_vulkan_renderer_cache_glyph (renderer, (PangoFont *)font, gi->glyph, op.text.scale);
+ texture_index = gsk_vulkan_renderer_cache_glyph (renderer,
+ (PangoFont *)font,
+ gi->glyph,
+ x_position + gi->geometry.x_offset,
+ gi->geometry.y_offset,
+ op.text.scale);
if (op.text.texture_index == G_MAXUINT)
op.text.texture_index = texture_index;
if (texture_index != op.text.texture_index)
}
else
count++;
+
+ x_position += gi->geometry.width;
}
if (op.text.texture_index != G_MAXUINT && count != 0)
if (gi->glyph != PANGO_GLYPH_EMPTY)
{
- double cx = (double)(x_position + gi->geometry.x_offset) / PANGO_SCALE;
- double cy = (double)(gi->geometry.y_offset) / PANGO_SCALE;
+ double cx = (x_position + gi->geometry.x_offset) / PANGO_SCALE;
+ double cy = gi->geometry.y_offset / PANGO_SCALE;
GskVulkanTextInstance *instance = &instances[count];
GskVulkanCachedGlyph *glyph;
- glyph = gsk_vulkan_renderer_get_cached_glyph (renderer, font, gi->glyph, scale);
+ glyph = gsk_vulkan_renderer_get_cached_glyph (renderer,
+ font,
+ gi->glyph,
+ x_position + gi->geometry.x_offset,
+ gi->geometry.y_offset,
+ scale);
instance->tex_rect[0] = glyph->tx;
instance->tex_rect[1] = glyph->ty;